import { createSlice } from '@reduxjs/toolkit'

const orderSlice = createSlice({
  name: 'order', // 唯一性
  initialState: {
    // 初始数据
    // 每个乘客，都是一个对象，需要放到 psgArr 数组中
    // { name, idcard, ticketType: '成人票/学生票/儿童票' }
    psgArr: [
      { name: '张飞', idcard: '411724200505118112', ticketType: '成人票' },
      { name: '刘备', idcard: '469023200505117381', ticketType: '学生票' }
    ],
    // 选座的数组，每个座位，格式必须为 '0-a'
    // 其中，0 表示行排，a 表示座位号 a-f
    seatArr: ['0-a', '0-b']
  },
  reducers: {
    // 添加单个乘客
    // action.payload 就是需要添加到数组中的那个乘客的信息对象
    // { name, idcard, ticketType: '成人票/学生票/儿童票' }
    addPsg(state, action) {
      state.psgArr.push(action.payload)
    },
    // 添加多个乘客
    // action.payload 就是提交过来的乘车人的数组，
    // 数组中包含的是一个一个的乘车人信息对象
    addPsgArr(state, action) {
      action.payload.forEach((item) => {
        if (!state.psgArr.find((x) => x.idcard === item.idcard)) {
          state.psgArr.push(item)
        }
      })
    },
    // 根据索引移除乘客
    // action.payload 就是“需要被移除的乘客的索引”
    removePsgByIndex(state, action) {
      state.psgArr = state.psgArr.filter((item, i) => i !== action.payload)
    },
    // 向选座的数组中，新增一个座位的编号，编号的格式为字符串 0-a
    addSeat(state, action) {
      // 1. 先判断，传入到函数中的 action.payload 是否已被选中
      // 1.1 如果座位已被选中，则需要把座位从数组中移除
      // 1.2 如果座位没有被选中，则需要把座位添加到仓库中 seatArr 数组中
      // 2. 当添加新座位的时候，需要判断座位有没有被选满
      // 2.1 如果没有被选满，直接把座位 push 到仓库的 seatArr 数组中
      // 2.2 如果座位被选满了，则先移除数组头部的座位，再把新座位 push 到数组的末尾。
      if (state.seatArr.includes(action.payload)) {
        // 移除座位
        state.seatArr = state.seatArr.filter((item) => item !== action.payload)
      } else {
        // 添加新座位
        if (state.seatArr.length >= state.psgArr.length) {
          // 选满了
          // 先移除旧座位，再添加新座位
          state.seatArr.shift()
          state.seatArr.push(action.payload)
        } else {
          // 没选满
          state.seatArr.push(action.payload)
        }
      }
    }
  }
})

export default orderSlice.reducer
export const { addPsg, removePsgByIndex, addSeat, addPsgArr } =
  orderSlice.actions
